package complie;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by cc
 * Description:
 * User: CZH
 * Date: 2023-01-05
 * Time: 14:42
 */
public class CommandUtil {

    /**
     * 通过 Runtime 类得到 Runtime 实例，执行 exec 方法
     * 获取到标准输出，并写入到指定文件中
     * 获取到标准错误，并写入到指定文件中
     * 待子进程结束，拿到子进程的状态码，并返回
     * @param cmd 指定命令
     * @param stdoutFile 把标准输出写入到哪个文件
     * @param stderrFile 把标准错误写入到哪个文件
     * @return
     */
    public static int run(String cmd, String stdoutFile, String stderrFile) {
        try {
            //1. 通过 Runtime 类得到 Runtime 实例，执行 exec 方法
            Process process = Runtime.getRuntime().exec(cmd);

            //2. 获取到标准输出，并写入到指定文件中
            if (stdoutFile != null) {
                InputStream stdoutFrom = process.getInputStream();
                FileOutputStream stdoutTo = new FileOutputStream(stdoutFile);
                while (true) {
                    int ch = stdoutFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stdoutTo.write(ch);
                }
                stdoutFrom.close();
                stdoutTo.close();
            }

            //3. 获取到标准错误，并写入到指定文件中
            if (stderrFile != null) {
                InputStream stderrFrom = process.getErrorStream();
                FileOutputStream stderrTo = new FileOutputStream(stderrFile);
                while (true) {
                    int ch = stderrFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stderrTo.write(ch);
                }
                stderrFrom.close();
                stderrTo.close();
            }

            //4. 等待子进程结束，拿到子进程的状态码，并返回
            int exitCode = process.waitFor();
            return exitCode;

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }

    public static void main(String[] args) {
        CommandUtil.run("javac","stdout.txt","stderr.txt");
    }

}
